package atividade;

import java.util.Arrays;

import dominio.ativacao.FuncaoAtivacao;
import dominio.ativacao.especializacao.FuncaoDegrau;
import dominio.ativacao.especializacao.FuncaoGaussiana;
import dominio.ativacao.especializacao.FuncaoLinear;
import dominio.ativacao.especializacao.FuncaoSignada;
import dominio.neuronio.Neuronio;
import dominio.neuronio.especializacao.NeuronioGenerico;
import dominio.neuronio.especializacao.NeuronioMcCullochPitts;
import dominio.padrao.Padrao;
import dominio.redeneural.RedeNeural;
import dominio.redeneural.especializacao.FeedForward;

@SuppressWarnings("unused")
public class Atividade4 {
	
	public static void main(String[] args) {
		
		if (args.length < 3) {
			System.err.println(">> parâmetros de entrada incorretos.");
			System.err.println(">> P1 - tipo de neuronio (1=McCulloch Pits, 2=Generico)");
			System.err.println(">> P2 - tipo de função de ativação (1=linear, 2=degrau, 3=signada, 4=gaussiana)");
			System.err.println(">> P3 - vetor de estimulos");
			System.exit(1);
		}
		
		//
		int cdTipoNeuronio = Integer.parseInt(args[0]);
		
		Class<? extends Neuronio> tipoNeuronio = null;
		
		switch ( cdTipoNeuronio ) {
			case 1:
				tipoNeuronio = NeuronioMcCullochPitts.class;
				break;
			case 2:
				tipoNeuronio = NeuronioGenerico.class;
				break;
			default:
				System.err.println(">> tipo de neuronio inválido.");
				System.exit(1);
				break;
		}
		
		//
		int cdFuncaoAtivacao = Integer.parseInt(args[1]);

		FuncaoAtivacao fa = null;
		
		switch (cdFuncaoAtivacao) {
		case 1:
			fa = new FuncaoLinear();
			break;
		case 2:
			fa = new FuncaoDegrau();
			break;
		case 3:
			fa = new FuncaoSignada();
			break;
		case 4:
			fa = new FuncaoGaussiana();
			break;
		default:
			System.err.println(">> tipo de função de ativação inválida.");
			System.exit(1);
			break;
		}
		
		//
		String[] strEntradas = Arrays.copyOfRange(args, 2, args.length);
		double[] entradas = new double[strEntradas.length];

		for (int i = 0; i < strEntradas.length; i++) {
			entradas[i] = Double.parseDouble(strEntradas[i]);
		}
		
		RedeNeural redeNeural = new FeedForward();

		redeNeural.criarCamadasNeurais( 
			1, //numero de camadas
			new int[]{4}, //neuronios por camada
			tipoNeuronio, //tipo de neuronio
			new FuncaoAtivacao[]{fa} //funcoes de ativacao por camada 
		);
		
		double[] estimularRedeNeural = redeNeural.estimularRedeNeural( new Padrao(entradas) );
		System.out.println(redeNeural);
	}

}
